package com.woniu.core.util;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

// Redis工具类
@Component
public class RedisUtil {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    //缓存:解决自带的RedisTemplate的序列化乱码的问题
    //这种依赖注入方式是通过bean的名称来匹配的，
    // 因此可以直接指定使用我们自己写的那个方法所创建的RedisTemplate实例。
    @Autowired
    private RedisTemplate<String,Object> jsonRedisTemplate;

    /**
     * 读取数据
     */
    //opsForValue()：只针对字符串的操作
    public void set(String key,String value) throws Exception {
        stringRedisTemplate.opsForValue().set(key,value);
    }
    public void set(String key,String value,long timeout) throws Exception{
        stringRedisTemplate.opsForValue().set(key,value,timeout,TimeUnit.SECONDS);
    }
    //一分钟是否可以重复发送短信
        public boolean exist(String key) throws Exception{
        return  stringRedisTemplate.hasKey(key);
    }
    //字符串自增1
    public void incr(String key) throws Exception{
        stringRedisTemplate.opsForValue().increment(key);
    }

    //获取字符串数据
    public String get(String key) throws Exception {
        return stringRedisTemplate.opsForValue().get(key);
    }

    //删除
    public void del(String key) throws Exception {
        stringRedisTemplate.delete(key);
    }

    //zset
    //向zset中新增一条数据，Double：可以传空，double不能传空
    public void zadd(String key,String value,Double score) throws Exception{
        stringRedisTemplate.opsForZSet().add(key,value,score);
    }
    //向zset中获取某数据的排序值（eg：zhangsan 175,175就是它的排序值）
    public Double zscore(String key,String value) throws Exception{
       return stringRedisTemplate.opsForZSet().score(key,value);
    }
    //向zset中删除一条数据
    public void zrem(String key,String value) throws Exception{
        stringRedisTemplate.opsForZSet().remove(key,value);
    }
    //zset中数据排序值的自增自减
    public void zincrby(String key,String value,Double incr) throws Exception{
        stringRedisTemplate.opsForZSet().incrementScore(key,value,incr);
    }
    //获取zset的数据个数：收藏的排行榜  zcard个数
    public long zcard(String key) throws Exception{
        return stringRedisTemplate.opsForZSet().zCard(key);
    }
    //根据排序值倒序查询zset中的数据段：收藏列表
    //zrerange返回值是set集合
    public Set<String> zrevrange(String key, Long start, Long end) throws Exception{
        return stringRedisTemplate.opsForZSet().reverseRange(key,start,end);
    }


    //Hash
    //新增大key的hash的数据
    public void hmset(String key, Map<Object,Object> map) throws Exception{
        //putAll增加很多hash
        stringRedisTemplate.opsForHash().putAll(key,map);
    }
    //hash自增，减的话就是传负数
    public void hincrby(String key, String hashKey,Integer m) throws Exception{
        stringRedisTemplate.opsForHash().increment(key,hashKey,m);
    }
    //取出hash数据中的某一个键值对
    public Object hget(String key, String hashKey) throws Exception{
       return stringRedisTemplate.opsForHash().get(key,hashKey);
    }
    //取出hash数据中的所有键值对
    public Map<Object,Object> hgetall(String key) throws Exception{
        return stringRedisTemplate.opsForHash().entries(key);
    }
    //查询hash数据
    public Map<Object,Object> hmget(String key) throws Exception{
        return stringRedisTemplate.opsForHash().entries(key);
    }






    //缓存：存储一个对象，采用默认的序列化方式保存到redis
    // * 保存对象数据永不过期
    public void setObject(String key, Object value) throws Exception{
        jsonRedisTemplate.opsForValue().set(key,value);
    }
    //   * 保存对象数据:存储一个对象，采用默认的序列化方式保存到redis
    public void setObject(String key, Object value,Integer minute) throws Exception{
        jsonRedisTemplate.opsForValue().set(key,value,minute);
    }
    // * 获取对象数据:查询一个对象redisClient会自动完成反序列化为对象
    public Object getObject(String key) throws Exception{
         return  jsonRedisTemplate.opsForValue().get(key);
    }



}
